package cn.net.Collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

//测试Map接口==数组+链表
/*《键值对》
符合映射规则，需同时指定Key Value数据类型
1.数据无序
2.key值不可重复
3.Map的初始容量是16,默认的加载因子是0.75；；影响hashmap的性能有两个因素：初始容量+加载因子
4.扩容只与数组存入程度有关，与链表无关。
5.Map接口允许null值，null键
 */

public class TestMap {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap();//多态；Map<Integer,String>
        map.put(9527,"红");
        map.put(9528,"橙");
        map.put(9529,"黄");
        map.put(9530,"绿");
        map.put(9531,"青");
        map.put(9532,"蓝");
        map.put(9533,"紫");
        System.out.println(map);//大括号{9527=红, 9528=橙, 9529=黄, 9530=绿, 9531=青, 9532=蓝, 9533=紫}
        /*测试其他常用方法*/
        //map.clear();
        System.out.println(map.containsKey(9528));//true
        System.out.println(map.containsValue("紫"));//true

        System.out.println(map.get(9530));
        System.out.println(map.remove(9527));//删除指定元素
        System.out.println(map);//{9528=橙, 9529=黄, 9530=绿, 9531=青, 9532=蓝, 9533=紫}
        System.out.println(map.get(9527));//null
        System.out.println(map.size());//6 获取个数
        System.out.println(map.hashCode());
        System.out.println(map.equals(9529));//false
        System.out.println(map.values());//把Map的所有值放入collection[橙, 黄, 绿, 青, 蓝, 紫]
        System.out.println(map);//{9528=橙, 9529=黄, 9530=绿, 9531=青, 9532=蓝, 9533=紫}

        System.out.println("----- /*对map集合进行遍历/迭代*/--------------------------");

        /* 遍历map中的数据,但是map本身没有迭代器,需要转换成set集合
         * Set<Key> :把map集合中的所有Key存到set集合中-->map.keySet()*/

        System.out.println("-----方式一:采用keySet()方法转换集合进行遍历/迭代-------------");
        //方式一:采用keySet()方法转换集合进行遍历/迭代，并用iterator()方法获取迭代器
        //1.将map中的key取出存入set集合,这里集合的泛型就是key对应的Integer类型
        Set<Integer> keySet =  map.keySet();
        //2.想要遍历集合,先获取集合的迭代器对象
        Iterator<Integer> it = keySet.iterator();
        while(it.hasNext()){
            Integer key = it.next();//next()方法
            String value = map.get(key);//get(key)方法
            System.out.println("{"+key+"="+value+"}");//保留大括号和等于号
            /*结果展示：
            {9528=橙}
            {9529=黄}
            {9530=绿}
            {9531=青}
            {9532=蓝}
            {9533=紫}
             */
        }
        System.out.println("-----方式二:采用entrySet()方法Map转换Set集合进行遍历/迭代-------------");
        //方式二:采用entrySet()方法转换集合进行遍历/迭代，并用iterator()方法获取迭代器
        /*遍历Map数据,把Map转成Set集合,把Map中的一对Key&Value所对应泛型作为一个Entry整体放入Set
        即 Set<Map.Entry<Integer,String>>----map.entrySet()方法
        一对 (K,V) 是一个 Entry ;    */

        //1.将map集合的每一对键值对作为Entry,逐一放入Set集合
        //set存放的是Entry对象,Entry的类型:Entry<Integer,String>
        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
        //2.获取迭代器对象：Iterator<Map.Entry<Integer,String>>
        Iterator<Map.Entry<Integer, String>> it2 = entrySet.iterator();
        //3.循环遍历set集合中的元素
        while(it2.hasNext()){//如果有元素就继续遍历
            //4.获取当前集合遍历到的entry对象
            Map.Entry<Integer, String> entry = it2.next();//next()方法
           // System.out.println(entry);
            Integer key = entry.getKey();//getKey()方法
            String value = entry.getValue();//getValue()方法
            System.out.println("{"+key+"="+value+"}");

        }


    }
}
